/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package general;

import general.util.MySecurityUtil;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.List;
import java.util.Scanner;
import java.util.TimeZone;
import jpa.controller.CidadeJpaController;
import jpa.controller.EmailParamsJpaController;
import jpa.controller.EtapaJpaController;
import jpa.controller.PermissionsJpaController;
import jpa.controller.SituacaoObraJpaController;
import jpa.controller.TipoDocumentoJpaController;
import jpa.controller.TipoMovimentoJpaController;
import jpa.controller.TipoPagamentoJpaController;
import jpa.controller.UserJpaController;
import jpa.entity.Cidade;
import jpa.entity.EmailParams;
import jpa.entity.Etapa;
import jpa.entity.Permissions;
import jpa.entity.SituacaoObra;
import jpa.entity.TipoDocumento;
import jpa.entity.TipoMovimento;
import jpa.entity.TipoPagamento;
import jpa.entity.User;

/**
 *
 * @author isaias
 */
public class SystemManager {
    public static final int defaultDuration = 30;
    private static SystemManager instance = new SystemManager();
    private static EmailParams emailParams = null;

    public static SystemManager getInstance() {
        return instance;
    }

    private SystemManager() {
    }

     public void init() {

        System.out.println("[SystemManager] Iniciado .... ");

         try {
             initPermissions(); // Criar permissões... Entity Permissions
         } catch (Exception e) {
             e.printStackTrace();
         }

        try {
            initEmailParams();  // Criar parametros para envio de e-mail... Entity EmailParams
        } catch (Exception ex) {
            ex.printStackTrace();
        }

         try {
              initUserTable(); // Criar usuario... Entity User
         } catch (Exception ex) {
             ex.printStackTrace();
         }

         try {
             initSituacaoObraTable(); // Criar sitiuação da obra... Entity SituacaoObra
         } catch (Exception e) {
             e.printStackTrace();
         }

         try {
             initEtapasTable(); // Criar etapas da obra... Entity Etapas
         } catch (Exception e) {
             e.printStackTrace();
         }

         try{
             initTipoDocumentoTable(); // Criar tipos de documentos... Entity TipoDocumento
         }catch(Exception e){
             e.printStackTrace();
         }

         try {
             initTipoMovimentoTable(); // Criar tipos de movimento... Entity TipoMovimento
         } catch (Exception e) {
             e.printStackTrace();
         }

         try {
             initTipoPagamentoTable(); // Criar tipo pagamento... Entity TipoPagamento
         } catch (Exception e) {
             e.printStackTrace();
         }

         try {
             initCidadesTable();
         } catch (Exception e) {
             e.printStackTrace();
         }

        System.out.println("[SystemManager] Finalizado");
    }

    private void initEmailParams() {
        System.out.println("[EmailParams] Configurando emails...");
        try {
            List<EmailParams> list = new EmailParamsJpaController().findEmailParamsEntities();
            emailParams = list.isEmpty() ? null : list.get(0);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        if (emailParams == null) {
            System.out.println("EmailParams não encontrado tentando criar um...");
            emailParams = new EmailParams();
            
            emailParams.setEmail("sgf@dynavideo.com.br");
            emailParams.setPassword("froid2011*_)");
            emailParams.setSmtp_server("smtp.gmail.com");
            emailParams.setSmtp_port(587);
            emailParams.setSSL(true);
            emailParams.setTLS(true);
            new EmailParamsJpaController().create(emailParams);
            System.out.println("EmailParams criado...");
        }

        EmailManager.updateEmailParams(emailParams);
    }

    // insere as permissões no banco de dados por meio do arquivo: backupPermissions.txt
    private void initPermissions(){
      
        int count = new PermissionsJpaController().getPermissionsCount();
         System.out.println(">>>>>>>>>>>>> [SystemManager] Permissions count: " + count);
        if(count < 1){
            try {
                InputStream is = SystemManager.class.getResourceAsStream("/resources/backups/backupPermissions.txt");
                 Scanner scanner = new Scanner(is);
                    Charset charset = Charset.forName("UTF-8");
                     CharsetDecoder charsetDecoder = charset.newDecoder();

                      while (scanner.hasNextLine()) {
                     
                          String general = charsetDecoder.decode(ByteBuffer.wrap(scanner.nextLine().getBytes())).toString();
                        


                          Permissions permissions = Permissions.formatPermissions(general);

                            try{
                                new PermissionsJpaController().create(permissions);
                                 System.out.println(">>>>>>>>>>>>>>> [SystemManager] Permissions Creation... "+ permissions.getName() );
                            }catch(Exception ex){
                                ex.printStackTrace();
                            }

                      }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    }

      private void initUserTable() {
        User user = null;
        try {
            user = new UserJpaController().findUserByLogin("ADMIN", true);
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(1);
        }

        System.out.println("User == " + user);


        if (user == null) {
            user = new User();
            user.setActive(true);
            user.setName("ADMINISTRADOR");
            user.setLogin("ADMIN");
            user.setPassword(MySecurityUtil.md5("123"));
            user.setEmail("isaiasbraga@live.com");
            user.setPhone("32431100");
            user.setIsAdministrator(false);
            user.setIsAdministrator(true);

            try {
                new UserJpaController().create(user);
                System.out.println("[initUserTable] Usuário admin criado com sucesso.");
            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }
    }

    private void initSituacaoObraTable(){
       SituacaoObra situacaoObra = null;
         try {
            List<SituacaoObra> situacaoObras = new SituacaoObraJpaController().findSituacaoObraEntities();

            if(situacaoObras.isEmpty()){
                for(int i=0;i<4;i++){
                    situacaoObra = new SituacaoObra();
                    switch(i){
                        case 0:
                               situacaoObra.setName("ORÇAMENTO");
                               System.out.println("Criando situação da obra... ORÇAMENTO");
                               new SituacaoObraJpaController().create(situacaoObra); 
                              break;
                        case 1:
                               situacaoObra.setName("EM ANDAMENTO");
                               System.out.println("Criando situação da obra... ");
                               new SituacaoObraJpaController().create(situacaoObra);
                            break;
                        case 2:
                               situacaoObra.setName("ENCERRADA COM PENDÊNCIA FINANCEIRA");
                               System.out.println("Criando situação da obra... Em Andamento");
                               new SituacaoObraJpaController().create(situacaoObra);  
                            break;

                         case 3:
                               situacaoObra.setName("ENCERRADA SEM PENDÊNCIA FINANCEIRA");
                               System.out.println("Criando situação da obra... ENCERRADA SEM PENDÊNCIA FINANCEIRA");
                               new SituacaoObraJpaController().create(situacaoObra);
                            break;
                           
                    }


                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


     private void initTipoDocumentoTable(){
       TipoDocumento tipo = null;
         try {

            List<TipoDocumento> tipos = new TipoDocumentoJpaController().findTipoDocumentoEntities();

            if(tipos.isEmpty()){
                for(int i=0;i<3;i++){
                    tipo = new TipoDocumento();
                    
                    switch(i){
                        case 0:
                               tipo.setName("NF");
                               System.out.println("Criando tipo de documento... NF");
                               new TipoDocumentoJpaController().create(tipo);
                              break;
                        case 1:
                              tipo.setName("FAT");
                               System.out.println("Criando tipo de documento... FAT");
                               new TipoDocumentoJpaController().create(tipo);
                            break;
                        case 2:
                                tipo.setName("REC");
                               System.out.println("Criando tipo de documento... REC");
                               new TipoDocumentoJpaController().create(tipo);
                            break;
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initTipoMovimentoTable(){
        TipoMovimento tipo = null;
        try {
            List<TipoMovimento> tipos = new TipoMovimentoJpaController().findTipoMovimentoEntities();
            if(tipos.isEmpty()){
                tipo = new TipoMovimento();
                tipo.setName("COMPRA");
                new TipoMovimentoJpaController().create(tipo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initTipoPagamentoTable(){
        TipoPagamento tipo = null;
        try {
            List<TipoPagamento> tipos = new TipoPagamentoJpaController().findTipoPagamentoEntities();
            if(tipos.isEmpty()){
                tipo = new TipoPagamento();
                tipo.setName("PARCELADO");
                new TipoPagamentoJpaController().create(tipo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initEtapasTable(){

        int count = new EtapaJpaController().getEtapaCount();
         System.out.println(">>>>>>>>>>>>> [SystemManager] Etapa count: " + count);
        if(count < 1){
            try {
                InputStream is = SystemManager.class.getResourceAsStream("/resources/backups/backupEtapas.txt");
                 Scanner scanner = new Scanner(is);
                    Charset charset = Charset.forName("UTF-8");
                     CharsetDecoder charsetDecoder = charset.newDecoder();

                      while (scanner.hasNextLine()) {

                          String general = charsetDecoder.decode(ByteBuffer.wrap(scanner.nextLine().getBytes())).toString();

                           Etapa etapa = Etapa.formatEtapa(general);
                         
                            try{
                                new EtapaJpaController().create(etapa);
                                
                                 System.out.println(">>>>>>>>>>>>>>> [SystemManager] Etapa Creation... "+ etapa.getName() );
                            }catch(Exception ex){
                                ex.printStackTrace();
                            }
                      }

            } catch (Exception e) {
            }
        }
    }


    private void initCidadesTable(){

        int count = new CidadeJpaController().getCidadeCount();
         System.out.println(">>>>>>>>>>>>> [SystemManager] Cidade count: " + count);
        if(count < 1){
            try {
                InputStream is = SystemManager.class.getResourceAsStream("/resources/backups/backupCidades.txt");
                 Scanner scanner = new Scanner(is);
                    Charset charset = Charset.forName("UTF-8");
                     CharsetDecoder charsetDecoder = charset.newDecoder();

                      while (scanner.hasNextLine()) {

                          String general = charsetDecoder.decode(ByteBuffer.wrap(scanner.nextLine().getBytes())).toString();

                          Cidade cidade = Cidade.formatCidade(general);

                            try{
                                new CidadeJpaController().create(cidade);
                                 System.out.println(">>>>>>>>>>>>>>> [SystemManager] Cidade Creation... "+ cidade.getName() );
                            }catch(Exception ex){
                                ex.printStackTrace();
                            }
                      }

            } catch (Exception e) {
            }
        }
    }

}
